package java5.genericity.standard;

import org.junit.Test;

import java.util.ArrayList;
import java.util.List;

public class Grammar {

    @SuppressWarnings("压制警告")
    @Test
    public void demo1() {
        ArrayList list = new ArrayList();
        list.add(Integer.valueOf(1));
        list.add(Double.valueOf(1));
        list.toArray();
        List<?> list1 = new ArrayList();
        numElementInCommon(list1);
        System.out.println("");
        //此处报错
        //numElementInCommon2(new ArrayList<String>());
        numElementInCommon4(new ArrayList<String>());
    }

    /**
     * 如果使用泛型，那么不关心 具体参数类型，那么可以用？ 替代。
     * 用通配符替代 的参数无法向 集合添加任何数据
     *
     * @param l List 是原生态类型
     *          List<?> 统配符类型
     *          list<Object> 特殊的参数化类型
     *          <p>
     *          区别：
     *          通配符类型是安全的，无法将任何元素（除了null） 放入到集合
     *          原生态类型是不安全的，然和类型都可以放入，破坏类型约束条件
     *          特殊化的参数类型，允许将List<String> 传给list ，但是无法将List<String> 传给List<Object>
     */
    private void numElementInCommon(List<?> l) {
        //此处编译错误
        //l.add("");
    }

    private void numElementInCommon2(List<Object> l) {
        l.add("");
    }

    private void numElementInCommon4(List l) {
        l.add("");
    }
}
